package com.linkgie.galaxyframework.process;

import java.util.Properties;

/**
 * 流程实例；
 * 
 * @author Hike
 *
 */
public interface ProcessFlow {

	/**
	 * 流程实例的Id；
	 * 
	 * @return
	 */
	String getId();

	/**
	 * 流程定义；
	 * 
	 * @return
	 */
	ProcessDefinition getDefinition();

	/**
	 * 流程上下文；
	 * 
	 * @return
	 */
	ProcessContext getContext();

	/**
	 * 流程是否处于活跃状态；
	 * <p>
	 * 
	 * 当流程尚未结束，返回 true ；
	 * <p>
	 * 
	 * 当流程已经结束，返回 false；
	 * 
	 * @return
	 */
	default boolean isActived() {
		return getContext().isActived();
	}
	
	/**
	 * 重置对数据集的修改，将数据回退到当前环节初始时的状态；
	 */
	void reset();

	/**
	 * 保存对数据集对修改；此操作不会驱动流程转移；
	 */
	void save();

	/**
	 * 保存当前上下文的修改并提交流程执行；
	 * <p>
	 * 
	 * 执行提交操作将驱使流程引擎根据上下文的数据和当前环节的分支条件来计算和匹配，驱动流程移到下一个执行环节；
	 */
	void commit();

	/**
	 * 终止流程；
	 */
	default void terminate() {
		terminate((Properties)null);
	}

	/**
	 * 以指定参数终止流程；
	 */
	void terminate(Properties args);
	
	/**
	 * 以指定异常终止流程；
	 */
	void terminate(Throwable error);
}
